   ************************************************************
   *               Floating Point Package Math48
   *      Version 1.1 Revision 1 by Anders Hejlsberg 1718 Bytes
   ************************************************************

     48 bit flydende tal matematikpakke for Z-80 baserede microcomputere
     Copyright (C) 1980 Blue Label Software

   * Introduktion:
   ************************************************************
     Math48 er en flydende tal matematikpakke til Z-80 baserede
     microcomputere. Programme, der kun fylder 2.5 KByte, omdanner
     6 af Z-80 processorend 16-bit registre til to flydende tal
     akkumulatorer, med 40 bits mantisse 0g 8 bits exponent. Denne
     arkitektur gr brugeren i stand til at udfre meget hurtige flydende
     tal regneoperationer med ca. 11 betydende cifre.

     Math48 indeholder 25 subroutiner med blands andet flgende funktioner:

       Addition, Subtraktion, Multiplikation, og Division
       Modulus og Potensoplftning
       Kvadratrodsuddragning
       De trigonometriske og invers trigonometriske funktioner
       Logaritme og Exponentialfunktionerne
       Heltals og Decimaldelsuddragning
       Konvertering til og fra 16-bits heltal
       Konvertering fra tekststreng til flydende tal
       Formatteret udskrift i fastkomma og exponentionel notation.

     Math48 krver intet andet arbejdslager end systemets stak,
     hvilket blandt andet muliggr rekursiv programmering, samtidig med
     at det letter programmeringen, da der ikke krves et arbejdslager p
     en fast adresse.

   * Flydende tal Format.
   ************************************************************

     Et flydende tal udgres af de tre 16-bit registre BC, DE og HL
     (samlet kaldet AC) eller de tilsvarende alternative registre
     BC', DE' og HL' (samlet kaldet AC').

     De fem 8-bit registre B,C,D,E og H (samlet kaldet BCDEH) udgr
     i den nvnte rkkeflge tallets mantisse i binr reprsentation.
     Det binre talkomma er placeret umiddelbart fr B registeret.
     Sledes angiver bit 7 i B antallet af halve (2^-1) i tallet,
     bit 6 antallet af kvarte (2^-2) etc.
     Vrdien af mantissen kan ogs opfattes som det binre heltal
     BCDEH divideret med 2^40.

     L registeret indeholder tallets exponent, dvs. det tal 2 skal
     oplftes i, for at give den faktor mantissen skal multipliceres
     med. Den absolutte vrdi af L registeret er exponenten plus
     128 (80H). Hvis L for eksempel har vrdien 83H er exponenten
     3. Hvis L har vrdien 7DH er exponenten -3.
     Hvis L er nul angiver det at hele tallet er nul. Sledes kan
     exponenten antage alle heltallige vrdier mellem -127 (01H) og
     127 (FFH).

     Heraf ses at tallet i AC skal opfattes p flgende mde:

         AC=(BCDEH/2^40)*2^(L-128)

     hvor BCDEH er at helt binrt tal.

     Da exponenten er den potens 2 skal oplftes i, glder der specielt,
     at vrdien af AC fordobles hvis der lgges en til exponenten, og
     halveres hvis der trkkes en fra exponenten.
     Ligeledes glder der at tallet i BCDEH fordobles hvis det skiftes
     en bit mod venstre og halveres hvis det skiftes en bit mod hjre.
     Man kan sledes, teoretisk set, skifte BCDEH mod hjre eller
     venstre et vilkrligt antal bits, blot dette antal lgges til
     eller trkkes fra exponenten.

     Det ovenstende udnyttes i enhver regneoperation til at normalisere
     tallet i AC:
     Mantissen (dvs. BCDEH) skiftes en bit mod venstre indtil den
     mest betydende bit er sat (bit 7 i B). Herefter trkkes antallet
     af skift fra exponenten.

     Denne normalisering foretages af to grunde: For det frste
     sikres det, at tallet altid har den maximale prcision, idet
     der bliver flest muligt betydende bits i mantissen.
     For det andet frigr det den mest betydende bit i mantissen,
     da denne altid ville vre sat i et normaliseret tal. Den mest
     betydende bit bliver i stedet brugt som fortegnsindikator:
     Hvis den er sat er tallet negativt. Hvis den er nul er tallet
     positivt. Den absolutte vrdi af et tal kan sledes udregnes
     blot ved at nulstille bit 7 i B registeret.

     Opbygningen af et flydende tal er sammenfattet:

         Reg. Bit    Betydning

          B    7     Fortegn. 0=Positivt. 1=Negativt.
          B   6-0    Mantisse bit   38-32. Bit 39 altid sat.
          C   7-0    Mantisse bit   31-24.
          D   7-0    Mantisse bit   23-16.
          E   7-0    hantisse bit   15-8.
          H   7-0    hantisse bit   7-0.
          L   7-0    L=0: Tallet er nul.
                     L>0: Exponent+128 (80H).

     Hvis det flydende tal er nul (dvs. hvis L registeret er nul)
     er det ligegyldigt hvad der str i mantissen blot fortegnsbitten
     er nul.

     Eksempler p flydende tal (BCDEH og L i hexnotation):

      BCDEH       L   Vrdi             Bemrkning

      0000000000  00  0                 L er nul.
      0000000000  81  1                 2^-1*2^1.
      0000000000  82  2                 2^-1*2^2.
      8000000000  82  -2                Negativt da bit 7 i B sat.
      7000000000  84  15                (2^-1+2^-2+2^-3+2^-4)*2^4.
      4800000000  87  100               (2^-1+2^-2+2^-5)*2^7.
      4CCCCCCCCD  7D  0.1               Ikke endeligt.
      0000000000  01  2.938735877E-39   Mindst mulige tal.
      7FFFFFFFFF  FF  1.701411835E+38   Strst mulige tal.
     *******************************************************************

     Bemrk at tallet 0.1 ikke er endeligt. Dette viser, at et tal
     der har et endeligt antal cifre i et talsystem (her titalssystemet)
     ikke ndvendigvis har et endeligt antal cifre i et andet
     (her det binre talsystem).

     Flgende metode kan benyttes til at omstte tal fra titalssystemet
     til flydende tal format (i hexnotation):

     1)   Gr tallet positivt. Tag totalslogaritmen af tallet
          (log2(x)=ln(x)/ln(2)), og afrund til det nrmeste heltal
          der er strre end resultatet. Dette er exponenten.

     2)   Divider tallet med 2 oplftet i exponenten. Tallet ligger
          nu i intervallet 1>X>=0.5, hvilket betyder at tallet er
          normaliseret

     3)   Multiplicer med 16. Heltalsdelen af det fremkomne resultat
          (minus 8 hvis det tal der omsttes var positivt) er det
          frste hexciffer i mantissen, dvs. MSD i B registeret.

     4)   Trk heltalsdelen fra tallet, sledes at det nu kommer til
          at ligge i intervallet 1>X>=0. Gang igen med 16. Heltalsdelen
          af det fremkomne resultat er det andet hexciffer i mantissen,
          dvs. LSD i B registeret.
          Fortst p denne mde indtil de resterende 8 hexcifre er
          beregnet. Hvis det 11. hexciffer er strre end 7 br tallet
          afrundes ved at der lgges 1 til BCDEH.

   * Math48 SUBRUTINER
   ************************************************************

     I det flgende bruges disse forkortelser:

          AC   Den flydende tal akkumulator der udgres af de 3
               16-bits registre BC, DE og HL.
          AC'  Den flydende tal akkumulator der udgres af de 3
               16-bits alternative registre BC', DE' og HL'.
          CF   Carry flaget i statusregisteret F.
          ZF   Zero flaget i statusregisteret F.

     Ved et kald af en Math49 subrutine bliver flgende registre
     ndret: AC, AF og AF'. Registrene AC', IX og IY ndrer ikke
     vrdi.

     Ved beskrivelsen af hver enkelt subrutine er flgende data
     opgivet:

     NAVN:        Subrutinens navn.
     FUNKTION:    Den funktion subrutinen udfrer.
     OFFSET:      Det hextal der skal lgges til Math48 startadressen
                  for at f subrutinens startadresse.
     INDGANG:     Hvis dette felt er tilstede angives de parametre
                  der er ndvendige for subrutinen, bortset fra AC
                  og eventuelt AC'.
     UDGANG:      Hvis dette felt er tilstede angives de parametre
                  der returneres af subrutinen, bortset fra AC.
     STAK:        Det maksimale antal bytes der bruges p stakken
                  bortset fra de 2 bytes der bruges ved kaldet.
     EKSEMPEL:    Eventuelle taleksempler.

     Hvis en regneoperation giver overflow (den absolutte vrdi af
     AC ville overstige 1.701411835E+38) bliver CF sat lig 1. Ved
     overflow er tallet i AC udefinerbart.
     Hvis en regneoperation giver underflow (den absolutte vrdi af
     AC ville blive mindre end 2.938735877E-39) bliver AC sat lig 0.


   *  FUNKTIONER MED TO ARGUMENTER
   ************************************************************

     Addition
     --------

     NAVN:      FPADD
     FUNKTION:  AC=AC+AC'. Tallet i AC' lgges til tallet i AC
                og resultatet placeres i AC.
     OFFSET:    00H
     UDGANG:    CF=0: OK.
                CF=1: Overflow.
     STAK:      10 bytes.


     Subtraktion
     ------------

     NAVN:      FPSUB
     FUNKTION:  AC=AC-AC'. Tallet i AC' trkkes fra tallet i AC
                og resultatet placeres i AC.
     OFFSET:    03H
     UDGANG:    CF=0: OK.
                CF=1: Overflow.
     STAK:      12 bytes.


     Multiplikation
     --------------

     NAVN:      FPMUL
     FUNKTION:  AC=AC*AC'. Tallet i AC multipliceres med tallet i
                AC' og resultatet placeres i AC.
     OFFSET:    06H
     UDGANG:    CF=0: OK.
                CF=1: Overflow.
     STAK:      16 bytes.


     Division
     --------

     NAVN:      FPDIV
     FUNKTION:  AC=AC/AC'. Tallet i AC divideres med tallet i AC'
                og resultatet placeres i AC.
     OFFSET:    09H
     UDGANG:    CF=0: OK.
                CF=1: Overflow eller AC' lig 0.
     STAK:      16 bytes.


     Modulus
     -------

     NAVN:      MOD
     FUNKTION:  AC=AC MOD AC' eller AC=FRAC(AC/AC')*AC'. AC bliver
                sat lig resten ved divisionen af AC med AC'.
                Resultatet har samme fortegn som AC.
     OFFSET:    0CH
     UDGANG:    CF=0: OK.
                CF=1: Divisionen AC/AC' giver overflow, eller
                      AC' er 0.
     STAK:      22 bytes.
     Potensoplftning
     ----------------

     NAVN:      PWR
     FUNKTZON:  AC=AC^AC' eller AC=EXP(AC'*LN(AC)). AC sttes lig
                AC oplftet i den potens der angives af AC'.
     OFFSET:    0FH
     UDGANG:    CF=0: OK.
                CF=1:  Overflow.
     STAK:      12 bytes.


     Sammenligning
     -------------

     NAVN:      CMP
     FUNKTION:  Sammenlign AC med AC'.
     OFFSET:    12H
     UDGANG:    ZF=1:      AC-AC'.
                ZF=0,CF=0: AC>AC'.
                ZF=0,CF=1: AC<AC'.
     STAK:      2 bytes




   * FUNKTIONER MED ET ARGUMENT
   ************************************************************

     Kvadratrodsuddragning
     ---------------------

     NAVN:      SQR
     FUNKTION:  AC=SQR(AC). AC sttes lig kvadratroden af AC.
     OFFSET:    15H
     UDGANG:    CF=0: OK.
                CF=1: AC<0.
     STAK:      31 bytes.


     Naturlig logaritme
     ------------------

     NAVN:      LN
     FUNKTION:  AC=LN(AC). AC sttes lig den naturlige logaritme
                af AC.
     OFFSET:    18H
     UDGANG:    CF=0: OK.
                CF=1: AC<=0.
     STAK:      10 bytes.


     Exponentialfunktionen
     ---------------------

     NAVN:      EXP
     FUNKTION:  AC=EXP(AC). AC sttes lig e oplftet i den potens
                der angives af AC, hvor e er grundtallet for den
                naturlige logaritme.
     OFFSET:    1BH
     UDGANG:    CF=0: OK.
                CF=1: Overflow.
     STAK:      40 bytes.


     Titalslogaritmen
     ----------------

     NAVN:      LOG
     FUNKTION:  AC=LOC(AC) eller AC=LN(AC)/LN(10). AC sttes lig
                titalslogaritmen af AC.
     OFFSET:    1EH
     UDGANG:    CF=0: OK.
                CF=1: AC<=0.
     STAK:      42 bytes.


     Sinus
     -----

     NAVN:      SIN
     FUNKTION:  AC=SIN(AC). AC sttes lig sinus af AC. Hvis den
                absolutte vrdi af AC er strre end 2*PI sttes AC
                lig AC MOD 2*PI fr udregningen af sinus.
     OFFSET:    21H
     STAK:      10 bytes.

     Cosinus
     -------

     NAVN:      COS
     FUNKTION:  AC=COS(AC) eller AC=SIN(PI/2-AC). AC sttes lig
                cosinus af AC.
     OFFSET:    24H
     STAK:      10 bytes.


     Tangens
     -------

     NAVN:      TAN
     FUNKTION:  AC=TAN(AC) eller AC=SIN(AC)/COS(AC). AC sttes lig
                tangens af AC.
     OFFSET:    27H
     UDGANG:    CF=0: OK.
                CF=1: Overflow ved divisionen SIN(AC)/COS(AC), dvs.
                      AC har en vrdi givet ved AC=PI/2+n*PI, hvor
                      n er et helt tal.
     STAK:      12 bytes.


     Arccus tangens
     --------------

     NAVN:      ATN
     FUNKTION:  AC=ATN(AC). AC sttes lig arccus tangens af AC.
                De returnerede vrdier ligger i intervallet
                PI/2 > ATN(AC) > -PI/2.
     OFFSET:    2AH
     STAK:      42 bytes.
     EKSEMPEL:  ATN( 1 )=PI/4
                ATN(-1 )=-PI/4


     St AC lig PI
     -------------

     NAVN:      ACPI
     FUNKTION:  AC=PI. AC sttes lig 3.14159265359.
     OFFSET:    2DH
     STAK:      0 bytes.


     Heltalsuddragning
     -----------------

     NAVN:      INT
     FUNKTION:  AC>=0: AC sttes lig det nrmeste heltal der er
                       mindre end eller lig tallet i AC.
                AC<0:  AC sttes lig det nrmeste heltal der er
                       strre end eller lig tallet i AC.
     OFFSET:    30H
     STAK:      8 bytes.
     EKSEMPEL:  INT(3.7)=3
                INT(-3.7)=-3

     Decimaldelsuddragning
     ---------------------

     NAVN:      FRAC
     FUNKTION:  AC=FRAC(AC) eller AC=AC-INT(AC). AC bliver sat lig
                decimaldelen af AC med samme fortegn som AC.
     OFFSET:    33H
     STAK:      20 bytes.
     EKSEMPEL:  FRAC(3.7)=0.7
                FRAC(-3.7)=-0.7


     St AC' lig AC
     --------------

     NAVN:      EQUAL
     FUNKTION:  AC'=AC. AC' sttes lig tallet i AC.
     OFFSET:    36H
     STAK:      6 bytes.


     Multiplicer AC med 10
     ---------------------

     NAVN:      MUL10
     FUNKTION:  AC=ABS(AC)*10. AC sttes lig den absolutte vrdi
                af AC multipliceret med 10.
     OFFSET:    39H
     UDGANG:    CF=0: OK.
                CF=1: Overflow.
     STAK:      6 bytes.


     Konverter flydende tal til 16-bits heltal
     -----------------------------------------

     NAVN:      FIX.
     FUNKTION:  HL=FIX(AC). konverter heltalsdelen af det flydende
                tal i AC til et 16-bits 2's komplement heltal, og
                gem resultatet i HL registeret.
     OFFSET:    3CH
     UDGANG:    CF=0: OK.
                CF=1: ABS(INT(AC)) > 32767
     STAK:      2 bytes.
     EKSEMPEL:  FIX(1.5)=    1=  0001H
                FIX(-1.5)=  -1=  FFFFH
                FIX(0.5)=    0=  0000H


     Konverter 16-bits heltal til flydende tal
     -----------------------------------------


     NAVN:      FLOAT
     FUNKTION:  AC=FLOAT(HL). Konverter det 16-bits 2's komplement
                heltal i HL til flydende tal format og gem resul-
                tatet i AC.
     OFFSET:    3FH
     STAK:      2 bytes.
     EKSEMPEL:  FLOAT(0001H)=1
                FLOAT (FFFFH)=-1

   * INPUT/OUTPUT RUTINER
   ************************************************************

     KONVERTER FLYDENDE TAL TIL TEKSTSTRENG
     --------------------------------------

     NAVN:      FSTRS
     FUNKTION:  Omst tallet i AC til en formatteret tekststreng,
                og gem denne i den buffer IX registeret peger p.
     OFFSET:    42H
     STAK:      15 bytes.
     INDGANG:   FSTRS kaldes p flgende mde:

                       CALL FSTRS
                       DB   FLAGS
                       DB   FIELDS  <<changed so IX points at end 00 byte >>

                Tekststrengens format afgres af de to bytes der
                flger umiddelbart efter kaldet (her kaldet FLAGS
                og FIELDS). Formatet kan vre et af to muligheder:

                     saaaaa.bbbbb       Fastkommanotation
                     sa.bbbbbEtxx       Exponentielnotation

                S    Fortegn.
                aaa  Heltalsdel (ved exponentialnotation er der
                     kun et ciffer i heltalsdelen).
                bbb  Decimaldel.
                     Angiver exponentialnotation.
                t    Exponentens fortegn (altid "+" eller "-").
                xx   Tocifret exponent.

                De to efterflgende bytes har flgende betydning:

                FLACS:   Denne byte afgr formatets type

                Bit 0     Udskriftstype
                           0 - Fastkommanotation
                           1 - Exponentialnotation
                Bit2-1    Fortegnsformat
                           00 - Intet fortegn
                           01 - AC>=0: Intet fortegn
                                AC<0:  "-"
                           10 - AC>=0: " "
                                AC<0:  "-"
                           11 - AC>=0: "+"
                                AC<0:  "-"
                Bit  3    Decimaldelsformat
                           0 - Kun betydende cifre
                           1 - Skriv alle cifre
                Bit  4    Heltalsdelsformat
                           0 - Kun betydende cifre
                           1 - Blanktegn fr betydende cifre

                FIELDS:   Denne byte indeholder heltals- og. decimal-
                          felternes lngder.

                Bit 3-0   Decimalfeltets lngde (0-15). Hvis lngden
                          er nul udskrives der intet decimalkonmma.
                Bit 7-1   Heltalsfeltets lngde (1-15). En lngde p nul
                          vil altid resultere i en fejl, hvis der er valgt
                          fastkommanotation. Hvis der er valgt exponential-
                          notation er indholdet af disse 4 bits irrelevant,
                          da der kun udskrives 1 ciffer
             Brugeren br sikre sig at den tekstbuffer IX registeret
             peger p, mindst har lngden DF+HF+2 for fastkommanotation
             og DF+8 for exponentialnotation, hvor DF er decimalfeltets
             lngde og HF er heltalsfeltets lngde.

     UDGANG: CF=0: Tekst bufferen indeholder det formatterede
                   tal afsluttet af en byte hvis vrdi er nul.
             CF=1: Tallet kan ikke omsttes i det specificerede
                   format. Tekstbufferen er urrt.

     EKSEMPEL:
             I de flgende eksempler er FLAGS angivet i binr
             notation, og FIELDS i hexnotation:

             TAL       FLACS  FIELDS  TEXSTSTRENC

             123.456   00010    FF    '123.456',00H
             -78       00010    FF    '-78',00H
             123.456   00100    FF    ' 123.456',00H
             123.456   00110    FF    '+123.456',00H
             123.456   00010    F2    '123.46',00H
             0.5       00010    F2    '0.5',00H
             -78       00010    F2    '-78',00H
             123.456   01010    F2    '123.456',00H
             0.5       01010    F2    '0.50',00H
             -78       01010    F2    '-78.00',00H
             123.456   10010    5F    '  123.456',00H
             0.5       10010    5F    '    0.5',00H
             -78       10010    5F    '  -78',00H
             123.456   11010    52    '  123.46',00H
             0.5       11010    52    '    0.50',00H
             -78       11010    52    '  -78.00',00H
             0         11010    52    '    0.00',00H
             123.456   00101    0F    ' 1.23456E+02',00H
             0.5       00101    0F    ' 5E-01',00H
             -78       00101    0F    '-7.8E+01',00H
             123.456   00101    03    ' 1.235E+02',00H
             0.5       00101    03    ' 5E-01',00H
             -78       00101    03    '-7.8E+01',00H
             123.456   01101    03    ' 1.235E+02',00H
             0.5       01101    03    ' 5.000E-01',00H
             -78       01101    03    '-7.800E+01',00H
             0         01101    03    ' 0.000E+00',00H

     Konverter flydende tal til tekststreng
     --------------------------------------

     NAVN:      FSTRR
     FUNKTION:  San FSTRS.
     OFFSET:    45H
     STAK:      15 bytes.
     INDGANG:   Register HL' indeholder formatet. L' svarer til
                FLAGS og H' til FIELDS. Betydningen af disse er
                forklaret under FSTRS. Et kald kunne for eksempel
                se sledes ud:

                     EXX
                     LD   HL,(FORMAT)
                     EXX
                     CALL FSTRR

     UDGANG:    Som FSTRS.

     Konverter tekststreng til flydende tal
     --------------------------------------

     NAVN:      CNVN
     FUNKTION:  Omst den tekststreng IX registeret peger p, til
                et flydende tal, og gem resultatet i AC.
     OFFSET:    48H
     STAK:      20 bytes.
     INDGANG:   IX registeret peger p den frste karakter i
                tekststrengen. Tekststrengen skal have et af de
                flsende formater:

                1)   saaa.bbb

                    s    Fortegn: Hvis s ikke er tilstede betragtes
                         tallet som positivt. Hvis s er tilstede skal
                         det vre "+" eller "-"
                    aaa  Heltalsdel (et vilkrligt antal cifre).
                    bbb  Decimaldel (et vilkrligt antal cifre).

                2)   saaa.bbbEtxx

                    E    Angiver at tallet efterflges af en titalsexponent.
                    t    Exponentfortegn: Hvis t ikke er tilstede betragtes
                         exponenten Som positiv. Hvis t er tilstede skal
                         det vre "+" eller  "-".
                    xx   Exponent i omrdet 37>=xx>=-37.

                    konverteringen stopper ved den frste karakter
                    der ikke passer i formatet.

     UDGANG:    CF=0: AC indeholder det konverterede tal.
                      IX  peger p karakteren umiddelbart efter
                      tallet.
                CF=1: Overflow.

     EKSEMPEL:  Dette program stter AC lig 189.445:

                START:   LD   IX,NUMBER   ;Peg til tekststreng
                         CALL CNVN        ;Konverter
                         :
                         :
                NUMBER:  DB  '189.445 '   ;Blanktegnet afslutter
                                          ;konverteringen

     <<< Change to CONV 8 digit and accept leading ZERO or SPACE >>>


     LNBR ADDR OBJ.CODE LABEL   MNEM OPERAND    COMMENT

     0001 1000                  ORC  1000H
     0002
     0003               ;Dette program beregner og udskriver vrdierne
     0004               ;af sinus og cosinus for vinkler mellem 0 og
     0005               ;360 grader i spring af 10 grader. Tallene i de
     0006               ;4 kolonner har flgende betydning:
     0007
     0008               ;1. Vinkelen i grader
     0009               ;2. Vinkelen i radianer
     0010               ;3. Sinus til vinkelen
     0011               ;4. Cosinus til vinkelen
     0012
     0013 0000          MRET:   EQU  0000H      ;Monitor varmstart
     0014 0003          AOUT:   EQU  0003H      ;Udskriv A registeret
     0015
     0016 8600          BASE:   EQU  8600H      ;Math4B startadresse
     0017
     0018 8600          FPADD:  EQU  BASE+00H
     0019 8606          FPMUL:  EQU  BASE+06H
     0020 8612          CMP:    EQU  BASE+12H
     0021 8621          SIN:    EQU  BASE+21H
     0022 8621          COS:    EQU  BASE+24H
     0023 8636          EQUAL:  EQU  BASE+36H
     0024 8612          FSTRS:  EQU  BASE+42H
     0025
     0026               ;Formatdefineringer
     0027
     0028 3012          FMT1:   EOU  30H*256+10010B
     0029 3A1A          FMT2:   EOU  3AH*256+11010B
     0030 4A1E          FMT3:   EOU  4AH*256+11110B
     0031
     0032
     0033 1000 DD217910         LD   IX,NUMBUF  ;Peg til talbuffer
     0031 1001 AF               XOR  A          ;Nulstil AC
     0035 1005 47               LD   B,A
     0036 1006 6F               LD   L,A
     0037
     0038 1007 CD4286   LOOP:   CALL FSTRS      ;Udskriv vinkel i
     0039 100A 1230             DW   FMT1       ;grader
     0040 100C CD6910           CALL PRNUM
     0041 100F C5               PUSH BC         ;Gem vinkel
     0042 1010 D5               PUSH DE
     0043 1011 E5               PUSH HL
     0044 1012 D9               EXX             ;Ombyt AC og AC'
     0045 1013 01FA0E           LD   BC,00EFAH  ;St AC lig PI/180
     0046 1016 111235           LD   DE,03512H
     0047 1019 217B96           LD   HL,0967BH
     0048 101C CD0686           CALL FPMUL      ;Omregn til radianer
     0049 101F CD3686           CALL EQUAL      ;Gem i AC'
     0050 1022 CD4286           CALL FSTRS      ;Udskriv vinkel i
     0051 1025 1A3A             DW   FMT2       ;radianer
     0052 1027 CD6910           CALL PRNUM
     0053 102A CD2186           CALL SIN        ;Udregn sinus
     0051 102D CD4286           CALL FSTRS      ;Udskriv sinus
     0055 1030 1E4A             DW   FMT3
     0056 1032 CD6910           CALL PRNUM
     0057 1035 D9               EXX             ;Hent vinkel
     0058 1036 CD2486           CALL COS        ;Udregn cosinus
     0059 1039 CD4286           CALL FSTRS      ;Udskriv cosinus
     0060 103C 1E4A             DW   FMT3
     LNBR ADDR OBJ.CODE LABEL   MNEM OPERAND    COMMENT

     0061 103E CD6910           CALL PRNUM
     0062 1041 3E0D             LD   A,l3      ;skift linie
     0063 1043 CD0300           CALL AOUT
     0064 1046 E1               POP  HL        ;Hent vinkel i grader
     0065 1047 D1               POP  DE
     0066 1048 C1               POP  BC
     0067 1049 D9               EXX             ;gem i AC'
     0068 104A 010020           LD   BC,02000H  ;St AC lig 10
     0069 104D 110000           LD   DE,00000H
     0070 1050 218400           LD   HL,00084H
     0071 1053 CD0086           CALL FPADD      ;Lg 10 til vinkelen
     0072 1056 D9               EXX             ;gem i AC'
     0073 1057 010034           LD   BC,03400H  ;st AC lig 360
     0074 105A 110000           LD   DE,00000H
     0075 105D 218900           LD   HL,00089H
     0076 1060 CD1286           CALL CMP        ;Er 360>AC?
     0077 1063 D9               EXX             ;Hent vinkelen
     0078 1064 30A1             JR   NC,LOOP    ;Ja => LOOP
     0079
     0080 1066 C30000           JP   MRET       ;Hop til monitor
     0081
     0082               ;Denne subrutine udskriver tallet i NUMBUF
     0083
     0084 1069 E5       PRNUM:  PUSH HL
     0085 106A 217910           LD   HL,NUMBUF
     0086 106D 7E       PR1:    LD   A,(HL)
     0087 106E B7               OR   A
     0088 106F 2806             JR   Z,PR2
     0089 1071 CD0300           CALL AOUT
     0090 1074 23               INC  HL
     0091 1075 18F6             JR   PR1
     0092 1077 E1       PR2:    POP  HL
     0093 1078 C9               RET
     0094
     0095 000F          NUMBUF: DS   15
     0096
     0097 1088                 END

   *                       SINUS & COSINUS
   ************************************************************

            0  0.0000000000     +0.0000000000     +1.0000000000
           10  0.1745329252     +0.1736481777     +0.9848077530
           20  0.3490658504     +0.3420201433     +0.9396926208
           30  0.5235987756     +0.5000000000     +0.8660254038
           10  0.6981317008     +0.6127876097     +0.7660444431
           50  0.8726646260     +0.7660444431     +0.6427876097
           60  1.0471975512     +0.8660254038     +0.5000000000
           70  1.2217304764     +0.9396926208     +0.3420201433
           80  1.3962634016     +0.9848077530     +0.1736481777
           90  1.5707963268     +1.0000000000     +0.0000000000
          100  1 7453292520     +0.9848077530     -0.1736481777
          110  1.9198621772     +0.9396926208     -0.3420201433
          120  2.0943951024     +0.8660254038     -0.5000000000
          130  2.2689280276     +0.7660444431     -0.6427876097
          110  2.4434609528     +0.6427876097     -0.7660444431
          150  2.6179938780     +0.5000000000     -0.8660254038
          160  2.7925268032     +0.3420201433     -0.9396926208
          170  2.9670597284     +0.1736481777     -0.9848077530
          180  3.1415926536     +0.0000000000     -1.0000000000
          190  3.3161255788     -0.1736481777     -0.9848077530
          200  3.4906585040     -0.3420201433     -0.9396926208
          210  3.6651914292     -0.5000000000     -0.8660254038
          220  3.8397243544     -0.6427876097     -0.7660444431
          230  4.0142572796     -0.7660444431     -0.6427876097
          210  4.1887902048     -0.8660254038     -0.5000000000
          250  4.3633231300     -0.9396926208     -0.3420201433
          260  4.5378560552     -0.9848077530     -0.1736481777
          270  4.7123889804     -1.0000000000     +0.0000000000
          280  4.8869219056     -0.9848077530     +0.1736481777
          290  5.0614548308     -0.9396926208     +0.3420201433
          300  5.2359877560     -0.8660254038     +0.5000000000
          310  5.4105206812     -0.7660444431     +0.6427876097
          320  5.5850536064     -0.6427876097     +0.7660444431
          330  5.7595865316     -0.5000000000     +0.8660254038
          310  5.9341194568     -0.3120201433     +0.9396926208
          350  6.1086523820     -0.1736481777     +0.9848077530
          360  6.2831853072     +0.0000000000     +1.0000000000

          ***********************************************************
